package com.xing.binbackend.pattern.proxy21.operation.audit;

import java.lang.reflect.Proxy;

/**
 * 运维操作审计代理（记录操作日志+权限验证）
 * 代理模式通过中介对象控制对原对象的访问，此处使用 动态代理 实现运维操作审计：
 * 权限验证：在方法执行前检查用户权限
 * 日志记录：在方法执行后记录操作信息
 * 透明代理：通过接口代理，无需修改原始业务代码
 */
public class Client {
    public static void main(String[] args) {
        OpsService realService = new OpsServiceImpl();
        // 创建代理对象
        OpsService proxy = (OpsService) Proxy.newProxyInstance(
                realService.getClass().getClassLoader(),
                realService.getClass().getInterfaces(),
                new AuditProxy(realService, "admin") // 测试合法用户
        );
        // 正常执行
        proxy.rebootServer();
        // 测试非法用户
        try {
            OpsService invalidProxy = (OpsService) Proxy.newProxyInstance(
                    realService.getClass().getClassLoader(),
                    realService.getClass().getInterfaces(),
                    new AuditProxy(realService, "guest")
            );
            invalidProxy.updateConfig("network.cfg");
        } catch (Exception e) {
            System.out.println("拦截非法操作: " + e.getMessage());
        }
    }
}
